package com.bookstore.back.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.bookstore.back.common.Result;
import com.bookstore.back.entity.Order;
import com.bookstore.back.entity.User;
import com.bookstore.back.service.OrderService;
import com.bookstore.back.util.UserContextUtil;
import com.bookstore.back.vo.OrderVO;
import com.bookstore.back.vo.UserVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 管理员订单控制器
 * 
 * @author 程序猿_Ti
 * @since 2025-07-24
 */
@RestController
@RequestMapping("/api/admin/orders")
public class AdminOrderController {

    @Autowired
    private OrderService orderService;
    
    @Autowired
    private UserContextUtil userContextUtil;

    /**
     * 获取订单列表（管理员权限）
     */
    @GetMapping
    public Result getOrderList(@RequestParam(defaultValue = "1") Integer current,
                              @RequestParam(defaultValue = "10") Integer size,
                              @RequestParam(required = false) String orderNo,
                              @RequestParam(required = false) String userName,
                              @RequestParam(required = false) String status) {
        UserVO user = userContextUtil.getCurrentUser();
        if (user == null) {
            return Result.error("用户未登录");
        }
        
        // 验证权限
        if (!user.getUserType().equals("admin") && !user.getUserType().equals("merchant")) {
            return Result.error("无权访问");
        }

        Map<String, Object> params = new HashMap<>();
        params.put("current", current);
        params.put("size", size);
        
        if (orderNo != null && !orderNo.isEmpty()) {
            params.put("orderNo", orderNo);
        }
        
        if (userName != null && !userName.isEmpty()) {
            params.put("userName", userName);
        }
        
        if (status != null && !status.isEmpty()) {
            params.put("status", status);
        }
        
        // 如果是商家，只能查看与自己相关的订单
        if (user.getUserType().equals("merchant")) {
            params.put("merchantId", user.getId().toString());
        }

        IPage<OrderVO> page = orderService.getOrderListWithUserInfo(params);
        Map<String, Object> data = new HashMap<>();
        data.put("page", page);
        return Result.success(data);
    }

    /**
     * 获取订单详情（管理员权限）
     */
    @GetMapping("/{id}")
    public Result getOrderDetail(@PathVariable("id") Integer id) {
        UserVO user = userContextUtil.getCurrentUser();
        if (user == null) {
            return Result.error("用户未登录");
        }
        
        // 验证权限
        if (!user.getUserType().equals("admin") && !user.getUserType().equals("merchant")) {
            return Result.error("无权访问");
        }

        Map<String, Object> orderDetail = orderService.getOrderDetailWithInfo(id);
        if (orderDetail == null) {
            return Result.error("订单不存在");
        }

        // 如果是商家，验证订单是否与自己相关
        if (user.getUserType().equals("merchant")) {
            OrderVO orderVO = (OrderVO) orderDetail.get("order");
            // 这里需要根据实际业务逻辑判断订单是否与商家相关
            // 例如，检查订单中的商品是否属于该商家
            // 简化处理，假设有一个merchantId字段
            if (!orderVO.getUserId().equals(user.getId().intValue())) {
                return Result.error("无权访问该订单");
            }
        }

        Map<String, Object> data = new HashMap<>();
        data.put("data", orderDetail);
        return Result.success(data);
    }

    /**
     * 更新订单状态（管理员权限）
     */
    @PatchMapping("/{id}/status")
    public Result updateOrderStatus(@PathVariable("id") Integer id, @RequestBody Map<String, Object> statusData) {
        UserVO user = userContextUtil.getCurrentUser();
        if (user == null) {
            return Result.error("用户未登录");
        }
        
        // 验证权限
        if (!user.getUserType().equals("admin") && !user.getUserType().equals("merchant")) {
            return Result.error("无权操作");
        }

        Integer status = Integer.parseInt(statusData.get("status").toString());
        
        // 如果是商家，验证订单是否与自己相关
        if (user.getUserType().equals("merchant")) {
            Order order = orderService.getById(id);
            if (order == null) {
                return Result.error("订单不存在");
            }
            
            // 这里需要根据实际业务逻辑判断订单是否与商家相关
            // 简化处理，假设有一个merchantId字段
            if (!order.getUserId().equals(user.getId().intValue())) {
                return Result.error("无权操作该订单");
            }
            
            // 商家只能进行特定的状态更新（例如只能发货）
            if (status != 2) { // 假设2是已发货状态
                return Result.error("商家只能进行发货操作");
            }
        }

        boolean success = orderService.updateOrderStatus(id, status);
        if (success) {
            return Result.success("更新订单状态成功");
        } else {
            return Result.error("更新订单状态失败");
        }
    }

    /**
     * 发货处理（管理员权限）
     */
    @PostMapping("/{id}/ship")
    public Result shipOrder(@PathVariable("id") Integer id, @RequestBody Map<String, Object> shippingData) {
        UserVO user = userContextUtil.getCurrentUser();
        if (user == null) {
            return Result.error("用户未登录");
        }
        
        // 验证权限
        if (!user.getUserType().equals("admin") && !user.getUserType().equals("merchant")) {
            return Result.error("无权操作");
        }

        Order order = orderService.getById(id);
        if (order == null) {
            return Result.error("订单不存在");
        }
        
        // 如果是商家，验证订单是否与自己相关
        if (user.getUserType().equals("merchant")) {
            // 这里需要根据实际业务逻辑判断订单是否与商家相关
            // 简化处理，假设有一个merchantId字段
            if (!order.getUserId().equals(user.getId().intValue())) {
                return Result.error("无权操作该订单");
            }
        }
        
        // 验证订单状态
        if (order.getStatus() != 1) { // 1表示已支付状态
            return Result.error("订单状态不正确，无法发货");
        }

        boolean success = orderService.shipOrder(id);
        if (success) {
            return Result.success("发货成功");
        } else {
            return Result.error("发货失败");
        }
    }

    /**
     * 取消订单（管理员权限）
     */
    @PostMapping("/{id}/cancel")
    public Result cancelOrder(@PathVariable("id") Integer id, @RequestBody Map<String, Object> cancelData) {
        UserVO user = userContextUtil.getCurrentUser();
        if (user == null) {
            return Result.error("用户未登录");
        }
        
        // 验证权限
        if (!user.getUserType().equals("admin")) {
            return Result.error("无权操作");
        }

        String reason = cancelData.get("reason") != null ? cancelData.get("reason").toString() : "管理员取消";
        boolean success = orderService.cancelOrder(id, reason);
        if (success) {
            return Result.success("取消订单成功");
        } else {
            return Result.error("取消订单失败");
        }
    }

    /**
     * 获取最近订单（管理员权限）
     */
    @GetMapping("/recent")
    public Result getRecentOrders(@RequestParam(defaultValue = "10") Integer limit) {
        UserVO user = userContextUtil.getCurrentUser();
        if (user == null) {
            return Result.error("用户未登录");
        }
        
        // 验证权限
        if (!user.getUserType().equals("admin") && !user.getUserType().equals("merchant")) {
            return Result.error("无权访问");
        }

        List<Order> recentOrders = orderService.getRecentOrders(limit);
        Map<String, Object> data = new HashMap<>();
        data.put("data", recentOrders);
        return Result.success(data);
    }

    /**
     * 获取订单统计数据（管理员权限）
     */
    @GetMapping("/stats")
    public Result getOrderStats() {
        UserVO user = userContextUtil.getCurrentUser();
        if (user == null) {
            return Result.error("用户未登录");
        }
        
        // 验证权限
        if (!user.getUserType().equals("admin") && !user.getUserType().equals("merchant")) {
            return Result.error("无权访问");
        }

        Map<String, Object> stats = orderService.getOrderStats();
        Map<String, Object> data = new HashMap<>();
        data.put("data", stats);
        return Result.success(data);
    }
} 